home *** CD-ROM | disk | FTP | other *** search
- #include "lib.h"
- #include <stdio.h>
- #include <signal.h>
- #include <sys/wait.h>
-
- static int pids[20];
-
- FILE *
- popen(command, type)
- _CONST char *command, *type;
- {
- int piped[2];
- int Xtype = *type == 'r' ? 0 : *type == 'w' ? 1 : 2;
- int pid;
- #ifndef __STDC__ /* for __STDC__ pick up proto from <std.h> */
- extern FILE *fdopen();
- #endif
-
- if (Xtype == 2 ||
- pipe(piped) < 0 ||
- (pid = fork()) < 0) return 0;
-
- if (pid == 0) {
- /* child */
- register int *p;
-
- for (p = pids; p < &pids[20]; p++) {
- if (*p) close(p - pids);
- }
- close(piped[Xtype]);
- dup2(piped[!Xtype], !Xtype);
- close(piped[!Xtype]);
- execl("/bin/sh", "sh", "-c", command, (char *) 0);
- exit(127); /* like system() ??? */
- }
-
- pids[piped[Xtype]] = pid;
- close(piped[!Xtype]);
- return fdopen(piped[Xtype], type);
- }
-
- int pclose(iop)
- FILE *iop;
- {
- int fd = fileno(iop);
- int status, wret;
- #ifdef __STDC__
- void (*intsave)() = signal(SIGINT, SIG_IGN);
- void (*quitsave)() = signal(SIGQUIT, SIG_IGN);
- void (*hupsave)() = signal(SIGHUP, SIG_IGN);
- #else
- int (*intsave)() = signal(SIGINT, SIG_IGN);
- int (*quitsave)() = signal(SIGQUIT, SIG_IGN);
- int (*hupsave)() = signal(SIGHUP, SIG_IGN);
- #endif
-
- fclose(iop);
- while ((wret = wait(&status)) != -1) {
- if (wret == pids[fd]) break;
- }
- if (wret == -1) status = -1;
- signal(SIGINT, intsave);
- signal(SIGQUIT, quitsave);
- signal(SIGHUP, hupsave);
- pids[fd] = 0;
- return status;
- }
-